package com.example.RuanJianKeShe.Dao.impl;

import com.example.RuanJianKeShe.Bean.Course;
import com.example.RuanJianKeShe.Bean.SC;
import com.example.RuanJianKeShe.Bean.Student;
import com.example.RuanJianKeShe.Dao.StuCourseDao;
import com.example.RuanJianKeShe.Utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.List;

public class StuCourseDaoImpl implements StuCourseDao {
    private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());




    /**
     * 添加学生选课信息
     *
     * @param sc 选课对象
     * @return Boolean
     */
    @Override
    public Boolean addStuCourse(SC sc) {
        if(!isExist(sc.getSno(),sc.getCno())) {
            String sql = "insert into sc(sno,cno,grade,createTime) values(?,?,?,?)";
            try {
                template.update(sql, sc.getSno(), sc.getCno(), sc.getGrade(), sc.getCreateTime());
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    /**
     * 获取教师所授课程的所有学生
     *
     * @param cno 课程号
     * @return 学生列表
     */
    @Override
    public List<Student> getStudentBySC(int cno) {
        String sql = "select student.* from student,sc where sc.sno = student.sno and sc.cno = ?";
        try{
            List<Student> studentList = template.query(sql,new BeanPropertyRowMapper<Student>(Student.class),cno);
            return studentList;
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 修改学生成绩
     *
     * @param sc 选课记录
     * @return
     */
    @Override
    public boolean setStuCourseGrade(SC sc) {
        String sql = "update sc set grade = ? where sno = ? and cno = ?";
        try{
            template.update(sql,sc.getGrade(),sc.getSno(),sc.getCno());
            return true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 通过学号获取学生选课
     *
     * @param sno 学号
     * @return 学生选课列表
     */
    @Override
    public List<Course> getCourseBySno(int sno) {
        String  sql = "select course.* from course,sc where course.cno = sc.cno and sc.sno = ? ";
        try{
            List<Course> courseList = template.query(sql,new BeanPropertyRowMapper<Course>(Course.class),sno);
            return courseList;
        }catch (Exception e){
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 通过学号课程号删除学生选课信息
     *
     * @param sno 学号
     * @param cno 课程号
     * @return Boolean
     */
    @Override
    public Boolean delStuCourseBySnoAndPno(int sno, int cno) {
        String  sql = "delete from sc where sno = ? and cno = ?";
        try{
            template.update(sql,sno,cno);
            return true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 查询所有选课记录
     *
     * @return 所有选课信息
     */
    @Override
    public List<SC> getAllSC() {
        String sql = "select * from sc";
        try{
            List<SC> scList = template.query(sql,new BeanPropertyRowMapper<SC>(SC.class));
            return scList;
        }catch (Exception e){

        }
        return null;
    }

    /**
     * 通过cno得到选课学生数量
     *
     * @param cno
     */
    @Override
    public int getStuSumByCno(int cno) {
        String sql = "select count(*) from sc where cno = ? group by cno";
        try{
            int sum = template.queryForObject(sql,Integer.class,cno);
            return sum;
        }catch (Exception e){
        }
        return 0;
    }

    /**
     * 判断是否存在该信息
     *
     * @param sno 学号
     * @param cno 课程号
     * @return 是否存在相同的选课信息
     */
    @Override
    public boolean isExist(int sno, int cno) {
        if(getStuCourse(sno,cno)!=null){
            return true;
        }
        return false;
    }

    /**
     * 返回一条选课信息
     *
     * @param sno 学号
     * @param cno 课程号
     * @return 选课信息
     */
    @Override
    public SC getStuCourse(int sno, int cno) {
        String sql="select * from sc where sno = ? and  cno = ?";
        try{
            SC sc = template.queryForObject(sql,new BeanPropertyRowMapper<SC>(SC.class),sno,cno);
            return sc;
        }catch (Exception e){
            System.out.println(e);
            return null;
        }
    }

}
